#include "../inc/queue.h"
#include <stdlib.h>

/*
 * @brief 初始化队列
 * @param in ppQueue 指向队列的二级指针
 * @return 成功初始化队列返回0，其它值未定义
 */
int queueInit(queue_t **ppQueue) {
    *ppQueue = (queue_t *)malloc(sizeof(queue_t));
    (*ppQueue)->pHead = NULL;
    (*ppQueue)->pTail = NULL;
    (*ppQueue)->size = 0;
    return 0;
}

/*
 * @brief 销毁队列
 * @param in pQueue 待销毁的队列
 * @return 成功销毁返回0，其它值未定义
 */
int queueDestory(queue_t *pQueue) {
    int tempFileDescribe = 0;
    // 循环出队，直到队列为空
    while (0 == queuePop(pQueue, &tempFileDescribe)) { }   
    free(pQueue);
    return 0;
}

/*
 * @brief 入队
 * @param in pQueue 待插入的队列
 * @param in fileDescribe 待插入队列的数值
 * @return 返回0表示插入成功
 */
int queuePush(queue_t *pQueue, int fileDescribe) {
    node_t *pNewNode = (node_t *)malloc(sizeof *pNewNode);
    pNewNode->fileDescribe = fileDescribe;
    pNewNode->pNext = NULL;

    if (0 == pQueue->size) {
        pQueue->pHead = pNewNode;
        pQueue->pTail = pNewNode;
    }
    else {
        pQueue->pTail->pNext = pNewNode;
        pQueue->pTail = pNewNode;
    }
    pQueue->size++;
    return 0;
}

/*
 * @brief 出队
 * @param in pQueue 待取出数据的队列
 * @param out pFileDescribe 传出取出的文件描述符
 * @return 正确出队返回0，如果对列大小为0，则返回-1
 */
int queuePop(queue_t *pQueue, int *pFileDescribe) {
    if (0 == pQueue->size) {
        return -1;
    }
    
    node_t *pTempNode = pQueue->pHead;
    *pFileDescribe = pTempNode->fileDescribe;
    
    pQueue->pHead = pQueue->pHead->pNext;
    pQueue->size--;

    free(pTempNode);
    return 0;
}